package online.chazi.bootplus.kafka.consumer.handler;

import online.chazi.bootplus.kafka.consumer.KafkaConsumerOffset;

import java.time.Duration;
import java.util.List;

/**
 * 说明：作者很懒，什么都没留下
 * Created by 叉子同学 on 2020-04-30 13:02
 */
public interface KafkaConsumerHandler<K, V> {

    /**
     * 消费到数据，需要实现如何处理数据
     *
     * @param topic     主题
     * @param partition 分区
     * @param offset    位置
     * @param v         消息内容
     */
    void consume(String topic, int partition, long offset, V v);

    /**
     * 从哪个partition的offset开始消费
     *
     * @param consumerId 消费唯一id
     * @param topic      主题
     * @param partition  分区
     * @return KafkaConsumerOffset
     */
    KafkaConsumerOffset seekOffset(String consumerId, String topic, int partition);

    /**
     * 消费到具体partition的offset需要自行保存纪录
     *
     * @param offsetList List<KafkaConsumerOffset>
     */
    void rebalanceOffset(List<KafkaConsumerOffset> offsetList);

    /**
     * 是否继续消费，可以用于逻辑控制暂停，继续消费
     *
     * @return boolean
     */
    boolean goAhead();

    /**
     * 每次消费之间的间隔时间
     *
     * @return Duration
     */
    Duration sleep();

    /**
     * 本次 topic，partition 消费的消息条数
     *
     * @param topic     主题
     * @param partition 分区
     * @param count     条数
     */
    void consumeCount(String topic, int partition, int count);

    /**
     * 超过fetch-max-wait没有拉取到数据，就会调用一下这个方法
     */
    void recordsEmpty();

    /**
     * consume方法处理数据时发生了异常。你可以决定如果处理它。
     *
     * @param throwable Throwable
     */
    void caughtException(Throwable throwable);

}
